package com.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import com.dao.ModeloDAO;
import com.dao.impl.mapper.ModeloMapper;
import com.modelo.Marca;
import com.modelo.Modelo;

public class IModeloDAO implements ModeloDAO {
	public Modelo modelo;
	private JdbcTemplate jdbcTemplate;
	private int id_modelo_nuevo = 0;
	@Autowired
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
		this.jdbcTemplate = jdbcTemplate;
	}


	@Override
	public Modelo buscarModelo(int id) {
		modelo = new Modelo();
		String sql = "select * from modelo where id = ?";
		try{
			modelo = jdbcTemplate.queryForObject(sql,new Object[]{id}, new RowMapper<Modelo>(){
																			public Modelo mapRow(ResultSet rs, int numrows)throws SQLException{
																				Modelo m = new Modelo();
																				m.setId(rs.getInt("id"));
																				m.setNombre(rs.getString("nombre"));
																				return m;
																			}

				
			} );
		}catch(Exception e){
			System.out.println("IModeloDAO buscarModelo() "+e.getMessage());
		}
		System.out.println("Modelo nombre IMOdeloDAO buscarModelo() "+modelo.getNombre());
		return modelo;
	}


	@Override
	public List<Modelo> buscarModeloPorMarca(int id) {
		String s_sql = "select * from modelo where id_marca = ? ";
		ArrayList<Modelo> modelos = new ArrayList<Modelo>();
		try{
			List<Map<String, Object>> rows_modelos = jdbcTemplate.queryForList(s_sql, id);
			
			for(Map row_modelo : rows_modelos){
				Modelo modelo = new Modelo();
				modelo.setId(Integer.parseInt(String.valueOf(row_modelo.get("id"))));
				modelo.setNombre(String.valueOf(row_modelo.get("nombre")));
				modelo.setId_marca(Integer.parseInt(String.valueOf(row_modelo.get("id_marca"))));
				modelos.add(modelo);
				System.out.println("IMarcaDAO: idModelo, nombreModelo: "+modelo.getId()+" "+modelo.getNombre());
			}
		}catch(Exception e){
			System.out.println("IModeloDAO buscarModeloPorMarca(): "+e.getMessage());
		}
		return modelos;
	}
	
	public List<Modelo> mostrar() {
		// TODO Auto-generated method stub
		List<Modelo> m = new ArrayList<Modelo>();
		try{
			String sql = "select id, nombre, id_marca from modelo";
			m = jdbcTemplate.query(sql, new ModeloMapper());
			System.out.println("IModeloDAo: ");
		}catch(Exception e){
			System.out.println("Error IModeloDAo mostrar(): "+e.getMessage());
		}
		return m;
	}


	@Override
	public int insertar(Modelo modelo) {
		String sql = "insert into modelo (nombre, id_marca) values (?, ?)";
		try{
			 id_modelo_nuevo=  jdbcTemplate.update(sql, new Object[]{modelo.getNombre(), modelo.getId_marca()});
			
		}catch(Exception e){
			id_modelo_nuevo = 0;
			System.out.println("Error IModeloDAO insertar() "+e.getMessage());
		}
		return id_modelo_nuevo;
	}


	@Override
	public boolean eliminar(int id) {
		// TODO Auto-generated method stub
		System.out.println("id de modelo que llega para eliminar: "+id);
		String sql = "delete from modelo where id = ?";
		try{
			jdbcTemplate.update(sql, new Object[]{id});
		}catch(Exception e){
			System.out.println("Error eliminando modelo en IModeloDAO: "+e.getMessage());
			return false;
		}
		return true;
	}


	@Override
	public Modelo actualizar(Modelo modelo) {
		// TODO Auto-generated method stub
		String sql = "update modelo set nombre = ? and id_marca = ? where id = ?";
		Modelo mo = new Modelo();
		try{
			jdbcTemplate.update(sql, new Object[]{modelo.getNombre(), modelo.getId_marca(), modelo.getId()});
			mo = buscarModelo(modelo.getId());
		}catch(Exception e){
			System.out.println("ICategoriaElementoDAO actualizar error: "+e.getMessage());
			
		}
		return mo;
	}


	@Override
	public int numeroElementosPorModelo(int id) {
		// TODO Auto-generated method stub
		int cantidad = 0;
		String sql = "select count(*) from elemento el, modelo mo where el.id_modelo = mo.id and mo.id=?";
		try{
			cantidad = jdbcTemplate.queryForInt(sql, new Object[]{id});
		}catch(Exception e){
			cantidad = 0;
			System.out.println("Error recogiendo cantidad de elementos por modelo::"+e.getMessage());
		}
		return cantidad;
	}


	@Override
	public boolean eliminarElementosPorModelo(int id) {
		// TODO Auto-generated method stub
		System.out.println("id que llega para eliminar modelo: "+id);
		String sql = "delete from elemento where id_modelo = ?";
		try{
			jdbcTemplate.update(sql, new Object[]{id});
		}catch(Exception e){
			System.out.println("Error eliminando elemento en IModeloDAO eliminarElementosPorModelo(): "+e.getMessage());
			return false;
		}
		return true;
	}

		
	public Modelo buscarModeloParaElemento(int idEl) {
		modelo = new Modelo();
		String sql = "select mo.id, mo.nombre, mo.id_marca from modelo mo, elemento el where el.id_modelo = mo.id and el.id = ?";
		try{
			modelo = jdbcTemplate.queryForObject(sql,new Object[]{idEl}, new RowMapper<Modelo>(){
																			public Modelo mapRow(ResultSet rs, int numrows)throws SQLException{
																				Modelo m = new Modelo();
																				m.setId(rs.getInt("id"));
																				m.setNombre(rs.getString("nombre"));
																				m.setId(rs.getInt("id_marca"));
																				return m;
																			}

				
			} );
		}catch(Exception e){
			System.out.println("IModeloDAO buscarModelo() "+e.getMessage());
		}
		System.out.println("Modelo nombre IMOdeloDAO buscarModelo() "+modelo.getNombre());
		return modelo;
	}


}
